package com.alipay.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;

/**
 * 名称：支付主类 功能：支付宝外部服务接口控制 接口名称：标准即时到账接口 版本：2.0 日期：2008-12-25 作者：支付宝公司销售部技术支持团队
 * 联系：0571-26888888 版权：支付宝公司
 * */
public class Payment {
	/**
	 * 
	 * 
	 * @param partner
	 *            合作身份者ID
	 * @param seller_email
	 *            签约支付宝账号或卖家支付宝帐户
	 * @param return_url
	 *            付完款后跳转的页面 要用 以http开头格式的完整路径，不允许加?id=123这类自定义参数
	 * @param notify_url
	 *            交易过程中服务器通知的页面 要用 以http开格式的完整路径，不允许加?id=123这类自定义参数
	 * @param show_url
	 *            网站商品的展示地址，不允许加?id=123这类自定义参数
	 * @param out_trade_no
	 *            请与贵网站订单系统中的唯一订单号匹配
	 * @param subject
	 *            订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
	 * @param body
	 *            订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
	 * @param price
	 *            订单总金额，显示在支付宝收银台里的“商品单价”里
	 * @param logistics_fee
	 *            物流费用，即运费。
	 * @param logistics_type
	 *            物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
	 * @param logistics_payment
	 *            物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
	 * @param quantity
	 *            商品数量，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品。	  
	 * @param input_charset
	 *            字符编码格式 目前支持 GBK 或 utf-8
	 * @param sign_type
	 *            加密方式 不需修改
	 * @param key
	 *            安全校验码
	 * @return 请求URL
	 */
	@SuppressWarnings("unchecked")
	public static String CreateUrl(String service,String partner, String seller_email, String return_url, String notify_url,   String out_trade_no,
			String subject,   String price, String logistics_fee, String logistics_type, String logistics_payment, String quantity,
			 String input_charset, String key, String sign_type ,String body) {
		Map sPara = new HashMap();
		
		sPara.put("service", service);
		sPara.put("payment_type", "1");
		sPara.put("partner", partner);
		sPara.put("seller_email", seller_email);
		
		sPara.put("return_url", return_url);
		sPara.put("notify_url", notify_url);
		sPara.put("_input_charset", input_charset);
		sPara.put("out_trade_no", out_trade_no);
		sPara.put("subject", subject);
		sPara.put("quantity", quantity);
		sPara.put("price", price);
		sPara.put("logistics_fee", logistics_fee);
		sPara.put("logistics_type", logistics_type);
		sPara.put("logistics_payment", logistics_payment);
		
		
		sPara.put("body", body);
		 

		String sign = com.alipay.util.Md5Encrypt.md5(getContent(sPara, key));
		return sign;
	}
	
	/**
	 * 立即到账
	 * @param paygateway
	 * @param service
	 * @param sign_type
	 * @param out_trade_no
	 * @param input_charset
	 * @param partner
	 * @param key
	 * @param show_url
	 * @param body
	 * @param total_fee
	 * @param payment_type
	 * @param seller_email
	 * @param subject
	 * @param notify_url
	 * @param return_url
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String CreateDirectUrl(String service, String sign_type, String out_trade_no, String input_charset,
			String partner, String key,   String body,String price, String quantity, String payment_type, String seller_email, String subject,
			String notify_url, String return_url) {// , String it_b_pay

		Map params = new HashMap();
		params.put("service", service);
		params.put("partner", partner);
		params.put("subject", subject);
		params.put("body", body);
		params.put("out_trade_no", out_trade_no);
		
		params.put("price", price);		
		params.put("quantity", quantity);	
		params.put("payment_type", payment_type);
		params.put("seller_email", seller_email);
		params.put("return_url", return_url);
		params.put("notify_url", notify_url);
		
		params.put("_input_charset", input_charset);

 

		String sign = com.alipay.util.Md5Encrypt.md5(getContent(params, key));

		return sign;

	}

	/**
	 * 功能：将安全校验码和参数排序 参数集合
	 * 
	 * @param params
	 *            安全校验码
	 * @param privateKey
	 * */
	@SuppressWarnings("unchecked")
	private static String getContent(Map params, String privateKey) {
		List keys = new ArrayList(params.keySet());
		Collections.sort(keys);

		String prestr = "";

		for (int i = 0; i < keys.size(); i++) {
			String key = (String) keys.get(i);
			String value = (String) params.get(key);

			if (i == keys.size() - 1) {
				prestr = prestr + key + "=" + value;
			} else {
				prestr = prestr + key + "=" + value + "&";
			}
		} 
		return prestr + privateKey;
	}
}
